﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.Models;
using Comissoes.JQGridObject; 

namespace Comissoes.Controllers
{
    public class ProdutosController : AppController
    {
        xcontEntities db = new xcontEntities();

        public ActionResult Index()
        {
            return View();
        }

        // Monta a lista de tipos de produtos
        public JsonResult List(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper)
        {
            try
            {
                var q = from c in db.PRODUTOS
                        select new
                        {
                            c.COD_PROD,
                            c.DESC_PROD,
                            c.UNIDADES.COD_UNID,
                            c.CUSTO_PROD,
                            c.MARGEM_PROD,
                            c.PRECO_PROD,
                            ATIVO_PROD = c.ATIVO_PROD == "A" ? "Sim" : "Não"
                        };

                Dictionary<string, string> formats = new Dictionary<string, string>
                {
                    { "CUSTO_PROD", "A" },                        
                    { "PRECO_PROD", "A" }
                };

                JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "COD_PROD", _search, rows, formats);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult Details(int id)
        {
            return View(new ProdutosModel(id));
        }

        // Monta a lista de tipos de produtos
        public JsonResult FornecedoresList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper, Int32 COD_PROD)
        {
            try
            {
                var q = from c in db.FORNECEDORES_PRODUTO
                        where c.PRODUTOS.COD_PROD == COD_PROD
                        select new
                        {
                            c.ID_FRPR,
                            c.FORNECEDORES.COD_FORN,
                            c.FORNECEDORES.PESSOAS.NOME_PESSOA
                        };

                JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ID_FRPR", _search, rows);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult FornecedorEdit()
        {
            return View();
        }

        [HttpPost]
        public ActionResult FornecedorEdit(Int32 COD_PROD, Int32 COD_FORN)
        {
            List<String> erros = new List<string>();

            try
            {
                db.AddToFORNECEDORES_PRODUTO(new FORNECEDORES_PRODUTO
                {
                    PRODUTOS = db.PRODUTOS.FirstOrDefault(t => t.COD_PROD == COD_PROD),
                    FORNECEDORES = db.FORNECEDORES.FirstOrDefault(t => t.COD_FORN == COD_FORN)
                });
                db.SaveChanges();

                return Json(new { result = true }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(new { result = false, erros = erros }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult FornecedorDelete(Int32? id)
        {
            List<String> erros = new List<string>();

            try
            {
                db.DeleteObject(db.FORNECEDORES_PRODUTO.FirstOrDefault(t => t.ID_FRPR == id));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Edit(Int32? id)
        {
            if (id.HasValue)
            {
                return PartialView(new ProdutosModel(id));
            }
            else
            {
                return PartialView(new ProdutosModel());
            }
        }

        [HttpPost]
        public ActionResult Edit(Int32? id, FormCollection form)
        {
            List<String> erros = new List<string>();

            try
            {
                ProdutosModel produto;

                if (id.HasValue)
                    produto = new ProdutosModel(id);

                else
                    produto = new ProdutosModel();

                if (produto.UpdateValidate(Request).Any())
                    return Json(produto.UpdateValidate(Request), JsonRequestBehavior.AllowGet);

                else if (produto.Update(Request).Any())
                    return Json(produto.Update(Request));

                return Json(produto.produto.COD_PROD, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        public ActionResult Update(Int32 COD_PROD, FormCollection form)
        {
            List<String> erros = new List<string>();

            try
            {
                ProdutosModel produto = new ProdutosModel(COD_PROD);

                return Json(produto.UpdateDetails(form), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Delete(Int32 id)
        {
            ProdutosModel produto = new ProdutosModel(id);

            return Json(produto.Delete(), JsonRequestBehavior.AllowGet);
        }

        public JsonResult ObterCodigoUnidade(Int32 COD_PROD)
        {
            return Json(db.PRODUTOS.Include("UNIDADES").FirstOrDefault(t => t.COD_PROD == COD_PROD).UNIDADES.COD_UNID, JsonRequestBehavior.AllowGet);
        }
    }
}